function isOperator(value) {
	var operatorString = '+-*/()×÷';
	return operatorString.indexOf(value) > -1;
}

function getPrioraty(value) {
	if (value == '-' || value == '+') {
		return 1;
	} else if (value == '*' || value == '/' || value == '×' || value == '÷') {
		return 2;
	} else {
		return 0;
	}
}

function prioraty(v1, v2) {
	return getPrioraty(v1) <= getPrioraty(v2);
}

function outputRpn(exp) {
	var inputStack = [];
	var outputStack = [];
	var outputQueue = [];
	var firstIsOperator = false;
	exp.replace(/\s/g, '');
	if (isOperator(exp[0])) {
		exp = exp.substring(1);
		firstIsOperator = true;
	}
	for (var i = 0, max = exp.length; i < max; i++) {
		if (!isOperator(exp[i]) && !isOperator(exp[i - 1]) && (i != 0)) {
			inputStack[inputStack.length - 1] = inputStack[inputStack.length - 1] + exp[i] + '';
		} else {
			inputStack.push(exp[i]);
		}
	}
	if (firstIsOperator) {
		inputStack[0] = -inputStack[0]
	}
	while (inputStack.length > 0) {
		var cur = inputStack.shift();
		if (isOperator(cur)) {
			if (cur == '(') {
				outputStack.push(cur);
			} else if (cur == ')') {
				var po = outputStack.pop();
				while (po != '(' && outputStack.length > 0) {
					outputQueue.push(po);
					po = outputStack.pop();
				}
			} else {
				while (prioraty(cur, outputStack[outputStack.length - 1]) && outputStack.length > 0) {
					outputQueue.push(outputStack.pop());
				}
				outputStack.push(cur)
			}
		} else {
			outputQueue.push(Number(cur));
		}
	}
	if (outputStack.length > 0) {
		while (outputStack.length > 0) {
			outputQueue.push(outputStack.pop());
		}
	}
	return outputQueue;
}

function calRpnExp(rpnArr) {
	var stack = [];
	for (var i = 0, max = rpnArr.length; i < max; i++) {
		if (!isOperator(rpnArr[i])) {
			stack.push(rpnArr[i]);
		} else {
			var num1 = stack.pop();
			var num2 = stack.pop();
			if (rpnArr[i] == '-') {
				var num = num2 - num1;
			} else if (rpnArr[i] == '+') {
				var num = num2 + num1;
			} else if (rpnArr[i] == '*' || rpnArr[i] == '×') {
				var num = num2 * num1;
			} else if (rpnArr[i] == '/' || rpnArr[i] == '÷') {
				var num = num2 / num1;
			}
			stack.push(num);
		}
	}
	return stack[0];
}

function calCommonExp(exp) {
	var rpnArr = outputRpn(exp);
	return calRpnExp(rpnArr)
}
// 图表封装
export default {
	canvasGraph(canvasID, data, summation, instance, size1, size2) {
		let query = uni.createSelectorQuery().in(instance).select(`#${canvasID}`).fields({
			node: true,
			size: true
		}).exec(res => {
			const canvas = res[0].node
			var ctx = canvas.getContext("2d")
			const width = res[0].width
			const height = res[0].height
			//初始画布大小
			const dpr = uni.getWindowInfo().pixelRatio
			canvas.width = width * dpr
			canvas.height = height * dpr
			ctx.scale(dpr, dpr)
			console.log(width, 'width');
			// ctx.clearRect(0, 0, canvas.width, canvas.height)
			function PieChart(ctx, radius) {
				//定义起始角度
				let tempAngle = 0;
				//定圆心位置
				let x0, y0
				if (Number(summation) >= 0) {
					x0 = width / 2,
						y0 = height / 2;
				} else {
					x0 = width / 2,
						y0 = height / 2;

				}
				//伸出长度
				let outLine = 8;
				PieChart.prototype.init = function(data) {
					this.drawPie(data);
				};
				// 绘画扇形 及中心圆
				PieChart.prototype.drawPie = function(data) {
					for (let i = 0; i < data.length; i++) {
						// 开始一个新路径
						ctx.beginPath();
						// 移动到中心点
						ctx.moveTo(x0, y0);
						//计算当前扇形角度   所占比例*360
						let angle = data[i].value * 360;
						//当前扇形起始绘制弧度   360 = 2π  等于6.28
						let startAngle = tempAngle * Math.PI / 180;
						//当前扇形借结束绘制弧度
						let endAngle = (tempAngle + angle) * Math.PI / 180;
						//绘制扇形  x y中心  半径  开始弧度  结束弧度
						ctx.arc(x0, y0, radius, startAngle, endAngle);
						//填充扇形
						ctx.fillStyle = data[i].color;
						// 填充
						ctx.fill();
						// 调用添加标题解释方法
						if (Number(summation) >= 0) {
							this.drawTitle(startAngle, angle, data[i].color, data[i].title)
						}
						//当前扇形结束绘制角度，即下一个扇形开始绘制角度
						tempAngle += angle;
					}
					// 开始一个新路径
					ctx.beginPath();
					// 开始画圆
					ctx.arc(x0, y0, size1, 0, 2 * Math.PI)
					// 填充颜色 白色
					ctx.fillStyle = 'white'
					// 调用绘制中心圆文字方法
					this.drawCenterTitle()
				}
				// 伸出线条方法
				PieChart.prototype.drawTitle = function(startAngle, angle, color, title) {
					// 伸出去的长度 斜边长度 等于半径加上定义好的长度  
					let out = radius;
					// 当前弧度的二分之一
					let du = startAngle + (angle / 2) * Math.PI / 180;
					// 计算伸出的点x坐标
					let outX = x0 + out * Math.cos(du);
					// 计算伸出的点y坐标
					let outY = y0 + out * Math.sin(du);
					// 开始一个新路径
					ctx.beginPath();
					// 移动到中心点
					ctx.moveTo(x0, y0);
					// 画出点到伸出点的一条线
					ctx.lineTo(outX, outY);
					// 线条颜色
					ctx.strokeStyle = color;
					//设置标题
					ctx.font = 'bold 14px Microsoft Yahei';
					// 计算出标题文字宽度
					let textWidth = ctx.measureText(title).width;
					// 计算标题样式
					ctx.textBaseline = "bottom";
					// 刷新配置项  象限判断 与 对应符号
					let optionArr = [{
							quadrant: outX >= x0 && outY <= y0,
							symbol: ['+', '-', 'left']
						},
						{
							quadrant: outX < x0 && outY <= y0,
							symbol: ['-', '-', 'right']
						},
						{
							quadrant: outX < x0 && outY > y0,
							symbol: ['-', '+', 'right']
						},
						{
							quadrant: outX >= x0 && outY > y0,
							symbol: ['+', '+', 'left']
						}
					]
					// 渲染的配置项
					let {
						symbol
					} = optionArr.find(el => el.quadrant && el.symbol)
					// 斜线起始点
					let slashState = calCommonExp(outX + symbol[0] + outLine)
					// 横线起始点
					let lineState = calCommonExp(outX + symbol[0] + textWidth + symbol[0] + outLine)
					// 终点
					let lineEnd = calCommonExp(outY + symbol[1] + outLine)
					// 标题文字样式
					ctx.textAlign = symbol[2];
					// 画出伸出的斜线
					ctx.lineTo(slashState, lineEnd);
					// 接上斜线画出标题下面的直线
					ctx.lineTo(lineState, lineEnd);
					// 填充标题
					ctx.fillText(title, slashState, lineEnd);
					// 填充
					ctx.stroke();
				}
				// 绘制中心文字
				PieChart.prototype.drawCenterTitle = function() {
					if (Number(summation) >= 0) {

						// 填充
						ctx.fill();
						// 文字颜色
						ctx.fillStyle = "#333333"
						// 文字位置
						// ctx.setTextAlign('center')
						//字体样式
						ctx.font = '20px Microsoft Yahei';
						ctx.textAlign = "center"
						// 插入文字
						ctx.fillText(`${summation}`, x0, y0 + 5)
						// 合计字体样式
						ctx.font = '14px Microsoft Yahei';
						// 文字颜色
						ctx.fillStyle = "#999999"
						// 插入文字
						ctx.fillText('大卡', x0, y0 + 20)
					}
					// 开始画图
					// ctx.draw()
				}
			}
			var PieChart = new PieChart(ctx, size2)
			PieChart.init(data)
		})
		// var ctx = uni.createCanvasContext(canvasID, instance)


	}

}